extends Spatial
# godot v3.3
#这个基类我随便选的，不重要
#原理:用面$Plane001 的点向地面发射线，来获得在其在地面的投影，绘制投影来生成光环
# 可以显示$Plane001 来观察
# 效果与地面和 $Plane001 的面数有关，面越细，贴和的越好


var vertices: PoolVector3Array #$Plane001 点构成面的数组，有重复点
var vertices_dict = {} #$Plane001 存放点，云除重复点
var vertices_scaled_dict = {} #$Plane001 放大缩小光环用，其实与vertices_dict 内容相同
var vertices_coll_dict = {} #$Plane001 存放与地面投影点
var normal_coll_dict = {} #$Plane001 存放投影点的法线向量
var uv_dict = {} #$Plane001 存放 uv 
var mesh: Mesh #光环基本型状，可以任何型状的平面，我这里用的方面 $Plane001
var aura: ImmediateGeometry # $Arua



func _ready():
	aura = $Aura
	mesh = $Plane001.mesh
	vertices = mesh.get_faces()
	# 存放所有点，云重复
	for vt in vertices:
		vertices_dict[vt] = vt
	#初始 缩放点 
	vertices_scaled_dict = vertices_dict
	
#	print("size of vertices=", vertices.size())
# 获取 $Plane001 点，uv, 这些信息都在 face_array
	var face_arry = mesh.surface_get_arrays(0)
#	print("face ",0,"=",face_arry[0])
#	print("face ",4,"=",face_arry[4])
# face_arry[0] 里是所有点，不知与 vertices_dict 顺序是否一样，未测
# face_arry[4] 点对应的 uv
# 保存 uv
	var i = 0
	for vt in face_arry[0]:
		uv_dict[vt] = face_arry[4][i]
		i += 1
	
#	for v in uv_dict:
#		print(v,"=",uv_dict[v])
	

# 生成 光环 mesh 的方法
func create_aura(space_state:PhysicsDirectSpaceState):
#	print("transform.origin=", transform.origin)
	for v in vertices_scaled_dict:
		# $Plane001 里的所有点位置
		var cast_pot = vertices_scaled_dict[v] + transform.origin
		# 从每个点向地面发射射线，来得到真实光环所有点和法线的向量
		var result = space_state.intersect_ray(cast_pot, Vector3(cast_pot.x, -10.0 ,cast_pot.z))
#		print(cast_pot, " ray_cast_result=",result)
		
		if result:
			#只取 结果中 y 轴上的数据，因为是垂直投影，加 Vector3(0,0.1,0),使光环稍高出地面，使其可见
			vertices_coll_dict[v] = Vector3(vertices_scaled_dict[v].x, 
											result.position.y-transform.origin.y, 
											vertices_scaled_dict[v].z) + Vector3(0, 0.1, 0)
			# 保存对应投影点的 法线向量
			normal_coll_dict[v] = result.normal
			
#	for v in vertices_coll_dict:
#		print(v,"=", vertices_coll_dict[v])
	
	
	if vertices_coll_dict:
		# 清空光环，重新绘制
		aura.clear()
		aura.begin(Mesh.PRIMITIVE_TRIANGLES)		
		# 依照 $Plane001 的原始数据和顺序绘制光环,先set 法线uv ,再添加对应点
		for vt in vertices:		
			aura.set_normal(normal_coll_dict[vt])
			aura.set_uv(uv_dict[vt])
			aura.add_vertex(vertices_coll_dict[vt])
		aura.end()
		

#		print("Aura.transform=", $Arua.transform.origin)
#			$Arua.global_translate(transform.origin*-1)	


#用来缩放原始点的方法
func update_vertices_scaled_dict():
#	print("$Plane001.scale=",$Plane001.scale)
	for v in vertices_scaled_dict:
#		print(v,"before scale =", vertices_scaled_dict[v])
		vertices_scaled_dict[v] = Vector3(v.x * $Plane001.scale.x,
									v.y,
									v.z * $Plane001.scale.z)
#		print(v,"after  scale =", vertices_scaled_dict[v])
	
	

func _physics_process(delta):
#	var cw = get_world() #current world
	# 取 PhysicsDirectSpaceState,用来发射线，射线只在_physics_process工作
	var space_state = get_world().direct_space_state
	#放大或缩小 ， 我用了0.2,可以改
	if Input.is_action_just_pressed("ui_page_up"):
		$Plane001.scale += Vector3(0.2, 0, 0.2)
		update_vertices_scaled_dict()
	if Input.is_action_just_pressed("ui_page_down"):
		$Plane001.scale -= Vector3(0.2, 0, 0.2)
		update_vertices_scaled_dict()
	
#	if Input.is_action_just_pressed("ui_accept"):
#		for v in vertices_coll_dict:
#			print(v,"=", vertices_coll_dict[v])
	# 生成 $Aura
	create_aura(space_state)
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
